package com.cskaoyan.duolai.clean.pay.utils;

import lombok.extern.slf4j.Slf4j;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

/**
 * 二维码过期时间工具类
 */
@Slf4j
public class QRCodeExpireUtils {

    private static final String EXPIRE_TIME_PREFIX = "|expireTime=";
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * 从二维码内容中提取过期时间
     *
     * @param qrCodeContent 二维码内容
     * @return 过期时间，如果没有过期时间信息则返回null
     */
    public static LocalDateTime extractExpireTime(String qrCodeContent) {
        if (qrCodeContent == null || !qrCodeContent.contains(EXPIRE_TIME_PREFIX)) {
            return null;
        }

        try {
            int index = qrCodeContent.indexOf(EXPIRE_TIME_PREFIX);
            String expireTimeStr = qrCodeContent.substring(index + EXPIRE_TIME_PREFIX.length());
            return LocalDateTime.parse(expireTimeStr, FORMATTER);
        } catch (DateTimeParseException e) {
            log.warn("解析二维码过期时间失败: {}", qrCodeContent, e);
            return null;
        }
    }

    /**
     * 从二维码内容中提取原始内容（去除过期时间信息）
     *
     * @param qrCodeContent 二维码内容
     * @return 原始内容
     */
    public static String extractOriginalContent(String qrCodeContent) {
        if (qrCodeContent == null || !qrCodeContent.contains(EXPIRE_TIME_PREFIX)) {
            return qrCodeContent;
        }

        int index = qrCodeContent.indexOf(EXPIRE_TIME_PREFIX);
        return qrCodeContent.substring(0, index);
    }

    /**
     * 检查二维码是否已过期
     *
     * @param qrCodeContent 二维码内容
     * @return true表示已过期，false表示未过期
     */
    public static boolean isExpired(String qrCodeContent) {
        LocalDateTime expireTime = extractExpireTime(qrCodeContent);
        if (expireTime == null) {
            // 如果没有过期时间信息，认为永不过期
            return false;
        }

        boolean expired = LocalDateTime.now().isAfter(expireTime);
        if (expired) {
            log.info("二维码已过期，过期时间: {}, 当前时间: {}",
                    expireTime.format(FORMATTER),
                    LocalDateTime.now().format(FORMATTER));
        }
        return expired;
    }

    /**
     * 获取二维码剩余有效时间（分钟）
     *
     * @param qrCodeContent 二维码内容
     * @return 剩余有效时间（分钟），如果已过期或没有过期时间信息则返回0
     */
    public static long getRemainingMinutes(String qrCodeContent) {
        LocalDateTime expireTime = extractExpireTime(qrCodeContent);
        if (expireTime == null) {
            return 0;
        }

        LocalDateTime now = LocalDateTime.now();
        if (now.isAfter(expireTime)) {
            return 0;
        }

        return java.time.Duration.between(now, expireTime).toMinutes();
    }
}
